package fr.uniscol.service.impl;

import java.util.Iterator;
import java.util.Map;

import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ResponseBody;

import fr.uniscol.model.EtablissementModel;
import fr.uniscol.model.ImportedDataModel;
import fr.uniscol.model.RapportTraitement;
import fr.uniscol.service.IImportDonneesService;
import fr.uniscol.siecle.dao.IImportDonneesSIECLEDao;
import fr.uniscol.siecle.model.FichierSIECLE;
import java.util.HashMap;

@Service("importsDonneesService")
public class ImportDonneesServiceImpl implements IImportDonneesService {

	public static Logger log = Logger.getLogger(ImportDonneesServiceImpl.class);
	
    @Autowired
    private IImportDonneesSIECLEDao donneesCommunsDao;
    @Autowired
    private IImportDonneesSIECLEDao donneesElevesDao;
    @Autowired
    private IImportDonneesSIECLEDao donneesNomenclaturesDao;
    @Autowired
    private IImportDonneesSIECLEDao donneesSTSDao;
    @Autowired
    private IImportDonneesSIECLEDao donneesStructuresDao;
    
	private Map<String, IImportDonneesSIECLEDao> importsDaos;   

	public Map<String, IImportDonneesSIECLEDao> getImportsDaos() {
        if(importsDaos == null){
            importsDaos = new HashMap<String, IImportDonneesSIECLEDao>();
            
            importsDaos.put("communs", donneesCommunsDao);
            importsDaos.put("eleves", donneesElevesDao);
            importsDaos.put("nomenclatures", donneesNomenclaturesDao);
            importsDaos.put("sts", donneesSTSDao);
            importsDaos.put("structures", donneesStructuresDao);
        }
		return importsDaos;
	}

	public void setImportsDaos(Map<String, IImportDonneesSIECLEDao> importsDaos) {
		this.importsDaos = importsDaos;
	}

	@Override
	@Transactional(readOnly=false)
	public boolean saveDonnees(EtablissementModel etablissement, ImportedDataModel datas, RapportTraitement rapport) {
		
		FichierSIECLE fichier = null;
		
		Iterator<String> itn = datas.getDonnees().keySet().iterator();
		String name = null;
		IImportDonneesSIECLEDao dao = null;
		
        while(itn.hasNext()){
            name = itn.next();

            fichier = datas.getDonnees().get(name);
            if(fichier == null){
                log.error("Aucune données à enregistrer pour le fichier '" + name + "'");
                continue;
            }

            dao = getImportsDaos().get(name);
            if(dao == null){
                throw new NullPointerException("Aucun DAO définit pour le fichier '" + name +"' !");

            }else{
                dao.saveFichierSIECLE(datas.getBase(), fichier, rapport);
            }
        }
		
		return true;
	}
}
